from datetime import datetime, timezone, timedelta
from typing_extensions import TypedDict

from fastmcp import FastMCP

mcp = FastMCP("Get Current datetime MCP")


class TimeResult(TypedDict):
    current_time: str
    current_timestamp: int


class TimestampToDatetimeResult(TypedDict):
    datetime_str: str  # ISO 8601 格式，如 "2025-09-22T15:30:45+08:00"


class DatetimeToTimestampResult(TypedDict):
    timestamp_ms: int  # 毫秒级时间戳


@mcp.tool(description="获取当前北京时间（UTC+8）的 ISO 8601 格式时间字符串和毫秒级 Unix 时间戳")
async def get_current_time() -> TimeResult:
    """获取当前北京时间（UTC+8）的 ISO 8601 格式时间字符串和毫秒级 Unix 时间戳。

    返回值：
        当前时间：ISO 8601 格式时间字符串，例如 '2025-09-22T17:40:26.730879+08:00'
        当前时间戳：自 Unix 纪元（UTC）以来的毫秒数，例如 '1758534026730'
    """
    now = datetime.now(timezone(timedelta(hours=8)))
    formatted_time = now.isoformat()
    timestamp = int(now.timestamp() * 1000)

    return {
        "current_time": formatted_time,
        "current_timestamp": timestamp
    }


@mcp.tool(description="将毫秒级 Unix 时间戳转换为北京时间（UTC+8）的 ISO 8601 时间字符串")
async def timestamp_to_datetime(timestamp_ms: int) -> TimestampToDatetimeResult:
    """将毫秒级 Unix 时间戳转换为北京时间（UTC+8）的 ISO 8601 时间字符串

    参数：
        毫秒级 Unix 时间戳，例如 1758534026730

    返回值：
        ISO 8601 时间字符串，例如 2025-09-22T17:40:26.730000+08:00
    """
    try:
        dt = datetime.fromtimestamp(timestamp_ms / 1000, tz=timezone(timedelta(hours=8)))
        return {"datetime_str": dt.isoformat()}
    except Exception as e:
        raise ValueError(f"Timestamp conversion failed：{str(e)}")


@mcp.tool(description="将 ISO 8601 格式的时间字符串转换为毫秒级 Unix 时间戳（UTC 基准）")
async def datetime_to_timestamp(datetime_str: str) -> DatetimeToTimestampResult:
    """将 ISO 8601 格式的时间字符串转换为毫秒级 Unix 时间戳（UTC 基准）

    参数：
        ISO 8601 格式的时间字符串，支持时区，例如 "2025-09-22T15:30:45+08:00" 或 "2025-09-22T07:30:45Z"

    返回值：
        毫秒级 Unix 时间戳，例如 1758534026730
    """
    try:
        dt = datetime.fromisoformat(datetime_str)
        timestamp_ms = int(dt.timestamp() * 1000)
        return {"timestamp_ms": timestamp_ms}
    except Exception as e:
        raise ValueError(f"Time string parsing failed：{str(e)}")


if __name__ == "__main__":
    mcp.run()
